package com.xueqiu.movieplaymanagersystem.handler;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import com.xueqiu.movieplaymanagersystem.exception.PageNotFoundException;
import com.xueqiu.movieplaymanagersystem.exception.SearchNotFountException;

import javax.servlet.http.HttpServletRequest;

/**
 * @author xueqiu
 */
@ControllerAdvice//全局控制器异常处理器。它可以用来集中处理多个控制器中抛出的异常。
@Slf4j
public class ControllerExceptionHandler {
    @ExceptionHandler(Exception.class)//方法级别的注解，用于指定处理哪种类型的异常。
    public ModelAndView exceptionHandler(HttpServletRequest request, Exception e) {
        log.error("Request Url : {} , Exception : {}", request.getRequestURL().toString(), e.toString());
        ModelAndView modelAndView = new ModelAndView();
        /*
        ModelAndView用于存储模型数据和视图信息的对象。
        通过设置视图名称和添加模型数据，可以将异常处理结果返回给客户端
         */
        if (e instanceof PageNotFoundException) {
            //对于无效访问资源错误，设置视图名称
            modelAndView.setViewName("error/404");
            return modelAndView;
        } else if (e instanceof SearchNotFountException) {
            //对于搜索失败错误，设置视图名称
            modelAndView.setViewName("error/415");
            return modelAndView;
        }
        //对于其他的错误，将请求的URL添加到模型数据中，以便在错误页面中使用
        modelAndView.addObject("url", request.getRequestURL());
        //将异常对象添加到模型数据中，以便在错误页面中使用
        modelAndView.addObject("exception", e);
        modelAndView.setViewName("error/error");
        return modelAndView;
    }
}
